/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 * vim: sw=2 ts=8 et :
 */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

include protocol PLayerTransaction;

namespace mozilla {
namespace layers {

/**
 * PLayer represents a layer shared across thread contexts.
 */

async protocol PLayer {
    manager PLayerTransaction;

    /**
     * OWNERSHIP MODEL
     *
     * Roughly speaking, the child side "actually owns" a Layer.  This
     * is because the parent side is the "shadow"; when the child
     * releases a Layer, the parent's shadow is no longer meaningful.
     *
     * To implement this model, the concrete PLayerParent keeps a
     * strong ref to its Layer, so the Layer's lifetime is bound to
     * the PLayerParent's.  Then, when the Layer's refcount hits 0 on
     * the child side, we send __delete__() from the child to parent.
     * The parent then releases its Layer, which results in the Layer
     * being deleted "soon" (usually immediately).
     */
parent:
    async __delete__();
};

} // layers
} // mozilla
